const { VITE_STORAGE_PREFIX } = import.meta.env
/**
 * 根据仓库类型使用 storage
 * @param storage 要操作的 storage
 * @returns
 */
function useStorage(storage: Storage, key = 'TOKEN') {
  const k = VITE_STORAGE_PREFIX + key
  /**
   * 根据 key 判断 storage 中是否有储存值
   * @param key 要判断的key
   * @returns
   */
  const has = () => {
    return !!storage.getItem(k)
  }

  /**
   * 根据 key 值获取储存在 storage 中的值
   * @param key 要获取的key
   * @returns
   */
  const get = () => {
    const value = storage.getItem(k)
    if (value) {
      try {
        return JSON.parse(value)
      } catch (e) {
        return value
      }
    }
  }

  /**
   * 根据 key 值向 storage 中储存值
   * @param key 要储存的key
   * @param value 需要储存在 storage 中的值
   */
  const set = (value: any) => {
    const val = () => {
      try {
        JSON.stringify(value)
      } catch (e) {
        return value
      }
    }
    storage.setItem(k, val())
  }

  /**
   * 根据 key 值移除储存在 storage 中的值
   * @param key 要删除的key
   */
  const remove = () => {
    storage.removeItem(k)
  }

  /**
   * 清空 storage
   */
  const clearAll = () => {
    storage.clear()
  }

  /**
   * 移除除了 key 之外的所有储存在 storage 中的值
   * @param key 要保留的key
   */
  const clearExcept = () => {
    Object.keys(storage).forEach((i) => {
      if (i !== k) {
        storage.removeItem(i)
      }
    })
  }

  return {
    has,
    get,
    set,
    remove,
    clearAll,
    clearExcept
  }
}

/**
 * 使用 sessionStorage
 */
const useSessionStorage = useStorage(window.sessionStorage || sessionStorage)

/**
 * 使用 localStorage
 */
const useLocalStorage = useStorage(window.localStorage || localStorage)

export { useSessionStorage, useLocalStorage, useStorage }
